<script setup>
	import {
		Management,
		UserFilled,
		User,
		Crop,
		EditPen,
		SwitchButton,
		CaretBottom, Plus,
		Files,
	} from '@element-plus/icons-vue'
	import avatar from '@/assets/default.png'
	import {adminApi} from '@/api/admin/admin.js'
	import {ElMessage, ElMessageBox} from "element-plus";
	
	//条目被点击后,调用的函数
	import {useRouter} from 'vue-router'
	
	const router = useRouter();
	
	import {useAdminInfoStore} from '@/store/adminInfo.js'
	
	const adminInfoStore = useAdminInfoStore();
	const getAdminInfo = () => {
		adminApi.adminInfo().then(result => {
			//数据存储在pinia中
			adminInfoStore.setAdminInfo(result.data)
		})
	}
	
	getAdminInfo()
	
	import {useTokenStore} from '@/store/token.js'
	import {ref} from "vue";
	
	const tokenStore = useTokenStore();
	const handleCommand = (command) => {
		//判断指令
		if (command === 'logout') {
			//退出登录
			tokenStore.removeToken();
			adminInfoStore.removeAdminInfo();
			
			// 跳转到登录
			router.push('/login')
		} else if (command === 'updateAdminInfo') {
			dialogUpdateAdminVisible.value = true
			Object.assign(admin.value,adminInfoStore.admin)
		} else if (command === 'resetPassword') {
			dialogResetPasswordVisible.value = true
			admin.value={}
		} else {
			//路由
			router.push('/admin/' + command)
		}
	}
	
	//修改个人信息
	const dialogUpdateAdminVisible = ref(false)
	const admin = ref({})
	// 头像
	const headers = ref({
		//携带token传递到后端
		Authorization: tokenStore.token
	});
	const handleAvatarSuccess = (result) => {
		admin.value.image = result.data
	}
	
	const updateAdminInfo = () => {
		adminApi.update(admin.value).then(result => {
			if (result.code === 0) {
				ElMessage({message: result.msg, type: 'success',})
				dialogUpdateAdminVisible.value = false
				//重新加载最新数据
				getAdminInfo()
			} else {
				ElMessage.error(result.msg)
			}
		})
	}
	
	//修改密码
	const dialogResetPasswordVisible = ref(false)
	const adminPassword = ref({})
	const resetFormRef=ref()
	//验证重复新密码
	const rePasswordValid = (rule, value, callback) => {
		if (value === '') {
			callback(new Error('请重复新密码！'))
		} else if (value !== adminPassword.value.newPassword) {
			callback(new Error("两次密码不一致！!"))
		} else {
			callback()
		}
	}
	
	//表单正则表达式验证
	const rules = ref({
		oldPassword: [
			{required: true, message: '请输入旧密码', trigger: 'blur'},
			{min: 3, max: 16, message: '密码的长度必须为3~16位', trigger: 'blur'}
		],
		newPassword: [
			{required: true, message: '请输入新密码', trigger: 'blur'},
			{min: 3, max: 16, message: '密码长度必须为3~16位', trigger: 'blur'}
		],
		reNewPassword: [
			{required: true, message: '请重复新密码', trigger: 'blur'},
			{validator: rePasswordValid, trigger: 'blur'}
		]
	})
	
	const resetInfoPassword = (formEl) => {
		if (!formEl) return
		formEl.validate((valid) => {
			if (valid) {
				adminApi.resetPassword(adminPassword.value).then(result=>{
					if (result.code === 0) {
						ElMessage({message: result.msg, type: 'success',})
						dialogResetPasswordVisible.value = false
						//退出登录
						tokenStore.removeToken();
						adminInfoStore.removeAdminInfo();
						// 跳转到登录
						router.push('/login')
					} else {
						ElMessage.error(result.msg)
					}
				})
			} else {
				ElMessage.error("验证失败！无法修改")
			}
		})
	}
	
</script>

<template>
	<!-- element-plus中的容器 -->
	<el-container class="layout-container">
		<!-- 左侧菜单 -->
		<el-aside width="200px">
			<div class="el-aside__logo"></div>
			<!-- element-plus的菜单标签 -->
			<el-menu active-text-color="#ffd04b" background-color="#232323" text-color="#fff"
					 router>
				<el-sub-menu>
					<template #title>
						<el-icon>
							<UserFilled/>
						</el-icon>
						<span>人员中心</span>
					</template>
					<el-menu-item index="/admin">
						<el-icon>
							<Management/>
						</el-icon>
						<span>管理人员</span>
					</el-menu-item>
					<el-menu-item index="/user">
						<el-icon>
							<Management/>
						</el-icon>
						<span>用户管理</span>
					</el-menu-item>
				</el-sub-menu>
				<el-sub-menu>
					<template #title>
							<el-icon><Files /></el-icon>
						<span>轮播管理</span>
					</template>
					<el-menu-item index="/carousel">
						<el-icon>
							<Management/>
						</el-icon>
						<span>首页轮播</span>
					</el-menu-item>
					<el-menu-item index="/newProduct">
						<el-icon>
							<Management/>
						</el-icon>
						<span>新品轮播</span>
					</el-menu-item>
				</el-sub-menu>
				<el-menu-item index="/category">
					<el-icon>
						<Management/>
					</el-icon>
					<span>分类管理</span>
				</el-menu-item>
				<el-menu-item index="/product">
					<el-icon>
						<Management/>
					</el-icon>
					<span>商品管理</span>
				</el-menu-item>
				<el-menu-item index="/order">
					<el-icon>
						<Management/>
					</el-icon>
					<span>订单管理</span>
				</el-menu-item>
				<el-menu-item index="/chart">
					<el-icon>
						<Management/>
					</el-icon>
					<span>统计图表</span>
				</el-menu-item>
			</el-menu>
		</el-aside>
		<!-- 右侧主区域 -->
		<el-container>
			<!-- 头部区域 -->
			<el-header>
				<div><strong>思途后台管理系统,欢迎&nbsp;{{adminInfoStore.admin.name}}</strong></div>
				<!-- 下拉菜单 -->
				<!-- command: 条目被点击后会触发,在事件函数上可以声明一个参数,接收条目对应的指令 -->
				<el-dropdown placement="bottom-end" @command="handleCommand">
                    <span class="el-dropdown__box">
                        <el-avatar :src="adminInfoStore.admin.image?adminInfoStore.admin.image:avatar"/>
                        <el-icon>
                            <CaretBottom/>
                        </el-icon>
                    </span>
					<template #dropdown>
						<el-dropdown-menu>
							<el-dropdown-item command="updateAdminInfo" :icon="User">基本资料</el-dropdown-item>
							<el-dropdown-item command="resetPassword" :icon="EditPen">重置密码</el-dropdown-item>
							<el-dropdown-item command="logout" :icon="SwitchButton">退出登录</el-dropdown-item>
						</el-dropdown-menu>
					</template>
				</el-dropdown>
			</el-header>
			<!-- 中间区域 -->
			<el-main>
				<!-- <div style="width: 1290px; height: 570px;border: 1px solid red;">
                    内容展示区
                </div> -->
				<router-view></router-view>
			</el-main>
			<!-- 底部区域 -->
			<el-footer>后台管理 ©2024 Created by Gao</el-footer>
		</el-container>
	</el-container>
	
	<el-dialog v-model="dialogUpdateAdminVisible" title="修改个人信息" width="500" :lock-scroll="false">
		<el-form :model="admin">
			<el-form-item label="姓&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;名：" :label-width="100">
				<el-input v-model="admin.name" autocomplete="off"/>
			</el-form-item>
			<el-form-item label="昵&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;称：" :label-width="100">
				<el-input v-model="admin.nickName" autocomplete="off"/>
			</el-form-item>
			<el-form-item label="联系方式：" :label-width="100">
				<el-input v-model="admin.phone" autocomplete="off"/>
			</el-form-item>
			<el-form-item label="邮&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;箱：" :label-width="100">
				<el-input v-model="admin.email" autocomplete="off"/>
			</el-form-item>
			<el-form-item label="头&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;像：" :label-width="100">
				<el-upload
					class="avatar-uploader"
					action="/api/admin/upload"
					:show-file-list="false"
					:on-success="handleAvatarSuccess"
					:headers="headers"
				>
					<img v-if="admin.image" :src="admin.image" class="avatar"/>
					<el-icon v-else class="avatar-uploader-icon">
						<Plus/>
					</el-icon>
				</el-upload>
			</el-form-item>
		</el-form>
		<template #footer>
			<div class="dialog-footer">
				<el-button @click="dialogUpdateAdminVisible = false">取消</el-button>
				<el-button type="primary" @click="updateAdminInfo">
					确认
				</el-button>
			</div>
		</template>
	</el-dialog>
	
	<el-dialog v-model="dialogResetPasswordVisible" title="修改密码" width="500" :lock-scroll="false">
		<el-form
			ref="resetFormRef"
			style="max-width: 600px"
			:model="adminPassword"
			status-icon
			:rules="rules"
			label-width="auto"
			class="demo-ruleForm"
		>
			<el-form-item prop="oldPassword" label="原&nbsp;&nbsp;&nbsp;&nbsp;密&nbsp;&nbsp;&nbsp;&nbsp;码：" :label-width="120">
				<el-input v-model="adminPassword.oldPassword" type="password" show-password autocomplete="off"/>
			</el-form-item>
			<el-form-item prop="newPassword" label="新&nbsp;&nbsp;&nbsp;&nbsp;密&nbsp;&nbsp;&nbsp;&nbsp;码：" :label-width="120">
				<el-input v-model="adminPassword.newPassword" type="password" show-password autocomplete="off"/>
			</el-form-item>
			<el-form-item prop="reNewPassword" label="重复新密码：" :label-width="120">
				<el-input v-model="adminPassword.reNewPassword" type="password" show-password autocomplete="off"/>
			</el-form-item>
		</el-form>
		<template #footer>
			<div class="dialog-footer">
				<el-button @click="dialogResetPasswordVisible = false">取消</el-button>
				<el-button type="primary" @click="resetInfoPassword(resetFormRef)">
					修改密码
				</el-button>
			</div>
		</template>
	</el-dialog>
</template>

<style lang="scss" scoped>
	.layout-container {
		height: 100vh;
		
		.el-aside {
			background-color: #232323;
			
			&__logo {
				height: 120px;
				background: url('@/assets/logo.png') no-repeat center / 120px auto;
			}
			
			.el-menu {
				border-right: none;
			}
		}
		
		.el-header {
			background-color: #fff;
			display: flex;
			align-items: center;
			justify-content: space-between;
			height: 50px;
			
			.el-dropdown__box {
				display: flex;
				align-items: center;
				
				.el-icon {
					color: #999;
					margin-left: 10px;
				}
				
				&:active,
				&:focus {
					outline: none;
				}
			}
		}
		
		.el-footer {
			display: flex;
			align-items: center;
			justify-content: center;
			font-size: 14px;
			color: #666;
			height: 30px;
		}
	}
	
	.avatar-uploader .avatar {
		width: 178px;
		height: 178px;
		display: block;
	}
</style>